有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java按照线程启动的顺序完成线程

我在不同的线程中同时下载了几个图像。我需要将这些映像设置为适配器。我需要按照启动的顺序完成这些线程,因为我正在使用回调通知适配器和

我如何才能做到这一点(按照线程启动的顺序完成线程)


共 (4) 个答案

  1. # 1 楼答案

    听起来您可能并不一定关心任务完成的顺序,而是希望控制处理结果的顺序

    如果您将Runnable提交给ExecutorService,您将获得一个将来的对象。然后可以使用Future对象的#get()方法http://developer.android.com/reference/java/util/concurrent/Future.html#get(),按顺序等待每个线程的结果

    如果使用AsyncTask执行每个线程,则可以使用AsyncTask的#get()方法http://developer.android.com/reference/android/os/AsyncTask.html#get()

    下面是一个代码示例:

    int time = nbrOfThreads;
    
    List<AsyncTask<Integer, Void, Integer>> tasks = new ArrayList<AsyncTask<Integer, Void, Integer>>();
    for (int i = 0; i < nbrOfThreads; i++) {
        final int threadNumber = i;
    
        AsyncTask<Integer, Void, Integer> task = new AsyncTask<Integer, Void, Integer>() {
    
            @Override
            protected Integer doInBackground(Integer... secondsToSleep) {
                try {
                    Thread.sleep(secondsToSleep[0] * 1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return threadNumber;
            }
        };
    
        tasks.add(i, task);
        task.execute(time--);
    }
    
    for (AsyncTask<Integer, Void, Integer> task : tasks) {
        print("Thread number: " + task.get() + " completed.");
    }
    
  2. # 2 楼答案

    按特定顺序完成线程与多线程编程的思想背道而驰。。。您不希望启动线程1、2和3,然后指定它们何时完成,因为它们可能有需要完全不同时间才能完成的任务

    例如,如果您正在两个不同的线程上下载两个不同的东西,那么如果线程1正在下载一个2 TB的文件,而线程2正在下载一个2 KB的文件,该怎么办?显然,线程2将在线程1之前很久完成,并且您不希望您的进程必须阻止等待线程1完成。。。我建议您重新思考您试图实现的目标,并相应地重新设计以避免出现这种情况

  3. # 3 楼答案

    您可以编写一个类,比如Mediator,将同一个类实例传递给所有线程。当线程完成下载时,他们将通过调用某种方法(比如downloadComplete(线程id))通知中介器,中介器将跟踪这些线程的顺序并进行回调

  4. # 4 楼答案

    按顺序完成线程可能不是您真正想要的-这将是一个相当人工的构造。我认为您可能真正想要的是一个所谓的屏障,即让线程运行,然后等待所有线程完成。之后,您可以调用一些代码(可能来自主线程)以按需要的顺序处理结果。为了等待所有线程完成,只需对所有线程调用join(),如下所示(为了清楚起见,跳过了错误处理):

    //Create and start workers asynchronously
    Thread[] workers = new Thread[NUM];
    for (int i = 0; i < workers.length; i++) {
        workers[i] = new MyWorkerThread(dataSlice[i]);
        workers[i].start();
    }
    //Barrier - wait till all threads are done
    for (int i = 0; i < workers.length; i++) {
        workers[i].join();
    }
    //Loop over generated results in some order, here reversed order just for fun
    for (int i = workers.length; i > 0; i--) {
        soSomething(dataSlice[i]);
    }